Enable AgentLog to handle a message with invalid byte sequences.

Use `String#scrub` which is new in Ruby 2.1 and add the `string-scrub`
gem for older rubies.

Addresses #286 and #613.

Akinori MUSHA 10 years ago
parent
commit
a1ccd58f17
4 changed files with 18 additions and 0 deletions
  1. 1 0
      Gemfile
  2. 2 0
      Gemfile.lock
  3. 8 0
      app/models/agent_log.rb
  4. 7 0
      spec/models/agent_log_spec.rb

+ 1 - 0
Gemfile

@@ -77,6 +77,7 @@ gem 'rufus-scheduler', '~> 3.0.8', require: false
77 77
 gem 'sass-rails',   '~> 4.0.0'
78 78
 gem 'select2-rails', '~> 3.5.4'
79 79
 gem 'spectrum-rails'
80
+gem 'string-scrub'	# for ruby <2.1
80 81
 gem 'therubyracer', '~> 0.12.1'
81 82
 gem 'typhoeus', '~> 0.6.3'
82 83
 gem 'uglifier', '>= 1.3.0'

+ 2 - 0
Gemfile.lock

@@ -371,6 +371,7 @@ GEM
371 371
       actionpack (>= 3.0)
372 372
       activesupport (>= 3.0)
373 373
       sprockets (~> 2.8)
374
+    string-scrub (0.0.5)
374 375
     systemu (2.6.4)
375 376
     term-ansicolor (1.3.0)
376 377
       tins (~> 1.0)
@@ -512,6 +513,7 @@ DEPENDENCIES
512 513
   spectrum-rails
513 514
   spring
514 515
   spring-commands-rspec
516
+  string-scrub
515 517
   therubyracer (~> 0.12.1)
516 518
   tumblr_client
517 519
   twilio-ruby (~> 3.11.5)

+ 8 - 0
app/models/agent_log.rb

@@ -11,6 +11,7 @@ class AgentLog < ActiveRecord::Base
11 11
   validates_presence_of :agent, :message
12 12
   validates_numericality_of :level, :only_integer => true, :greater_than_or_equal_to => 0, :less_than => 5
13 13
 
14
+  before_validation :scrub_message
14 15
   before_save :truncate_message
15 16
 
16 17
   def self.log_for_agent(agent, message, options = {})
@@ -31,6 +32,13 @@ class AgentLog < ActiveRecord::Base
31 32
 
32 33
   protected
33 34
 
35
+  def scrub_message
36
+    if message_changed?
37
+      self.message.scrub!{ |bytes| "<#{bytes.unpack('H*')[0]}>" }
38
+    end
39
+    true
40
+  end
41
+
34 42
   def truncate_message
35 43
     self.message = message[0...10_000] if message.present?
36 44
   end

+ 7 - 0
spec/models/agent_log_spec.rb

@@ -42,6 +42,13 @@ describe AgentLog do
42 42
     end
43 43
   end
44 44
 
45
+  it "replaces invalid byte sequences in a message" do
46
+    log = AgentLog.new(:agent => agents(:jane_website_agent), level: 3)
47
+    log.message = "\u{3042}\xffA\x95"
48
+    expect { log.save! }.not_to raise_error
49
+    expect(log.message).to eq("\u{3042}<ff>A\<95>")
50
+  end
51
+
45 52
   it "truncates message to a reasonable length" do
46 53
     log = AgentLog.new(:agent => agents(:jane_website_agent), :level => 3)
47 54
     log.message = "a" * 11_000